/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Test {
    public static class ListNode {
     int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
  }
    public ListNode reverseList(ListNode head) {
        if(head==null){
            return head;
        }
        if(head.next==null){
            return head;
        }
        ListNode cur = head.next;
        head.next=null;
        while(cur!=null){
            ListNode curNext=cur.next;
            //错误：
            //curNext = head;
            //这里的 curNext 是一个局部变量，存储的是一个对象的引用。执行这行代码后，
            // curNext 的值（即所指向的对象的地址）被修改，开始指向 head 所指向的对象。
            // 但是，这只是改变了 curNext 自己的指向，与 cur 和链表结构没有任何关系。

            //cur.next = head;
            //这里的 cur.next 是 cur 节点对象的属性（字段），是链表结构的一部分。
            // 当执行 cur.next = head; 时，你修改了 cur 所指向的对象的 next 属性（即指针）。
            // 这个操作直接改变了链表的结构，因为它修改了节点之间的链接关系。
            // curNext=head;

            //修改引用本身（cur = ...）：
            //只改变了当前变量指向的对象，不影响其他引用。
            //
            //修改引用指向对象的属性（cur.val = ...）：
            //直接改变了堆内存中对象的内容，所有引用都会感知到这个变化。
            //
            //原因：
            //
            //引用变量是存储在栈中的一个地址指针。
            //引用指向的对象存储在堆中，多个引用共享这块堆内存。
            //这就是为什么 可以修改属性，但不能修改引用本身的原因！
            cur.next=head;
            head=cur;
            cur=curNext;
        }
        return head;
    }
}